package negocios;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import util.Criptografia;

/**
 * Classe para manipular os Usuarios do Sistema I'm Here. Implementa o padrao
 * Iterator.
 * 
 * @author Jonathan Brilhante
 * @author Jose Rafael
 * @author Nata Venancio
 * @author Renato Almeida
 * 
 * @version 2.0
 */

public class ColecaoUsuarios implements Iterable<Usuario> {
	private List<Usuario> usuarios;

	/**
	 * Cria uma colecao de usuarios, inicialmente vazia
	 */
	public ColecaoUsuarios() {
		usuarios = new ArrayList<Usuario>();
	}

	/**
	 * Busca um usuario pelo seu nome, login, email ou telefone. A pesquisa sera
	 * feita baseada se nome, ou login, telefone, e email, sao iguais a
	 * substring passada (use uma string vazia "" para ignorar o parametro). A
	 * pesquisa eh case insensitive.
	 * 
	 * @param nome
	 *            o nome do usuario a pesquisar
	 * @param login
	 *            o login do usuario a pesquisar
	 * @param email
	 *            o email do usuario a pesquisar
	 * @param telefone
	 *            o telefone do usuario a pesquisar
	 * @return o usuario pesquisado, null caso nao exista.
	 */
	public Usuario buscar(String nome, String login, String email,
			String telefone) {
		for (Usuario us : usuarios) {
			if (us.getNome().equalsIgnoreCase(nome)
					|| us.getLogin().equalsIgnoreCase(login)
					|| us.getEmail().equals(email)
					|| us.getTelefone().equals(telefone)) {
				return us;
			}
		}
		return null;
	}

	/**
	 * Busca um usuario por login e senha (se ambos forem compativeis).
	 * 
	 * @param login
	 *            o login do usuario
	 * @param senha
	 *            a senha do usuario
	 * @return o usuario buscado, null caso nao exista.
	 */
	public Usuario buscaPorLogin(String login, String senha) {
		for (Usuario us : usuarios) {
			if (us.getLogin().equals(login)
					&& Criptografia.decifra(us.getSenha()).equals(senha)) {
				return us;
			}
		}
		return null;
	}

	/**
	 * Retorna uma lista de usuarios cujos nomes comecam com o prefixo do
	 * parametro.
	 * 
	 * @param prefixo
	 *            o prefixo do nome
	 * @return a lista de usuarios
	 */
	public List<Usuario> usuariosPorNome(String prefixo) {
		List<Usuario> usuariosPorNome = new ArrayList<Usuario>();
		prefixo = prefixo.toLowerCase();
		for (Usuario us : usuarios) {
			if (us.getNome().toLowerCase().startsWith(prefixo)) {
				usuariosPorNome.add(us);
			}
		}
		return usuariosPorNome;
	}

	/**
	 * Adiciona um usuario a colecao.
	 * 
	 * @param us
	 *            o usuario a adicionar
	 */
	public void add(Usuario us) {
		usuarios.add(us);
	}

	/**
	 * Limpa a lista de usuarios
	 */
	public void reset() {
		usuarios.clear();
	}

	/**
	 * Remove o usuario da colecao
	 * 
	 * @param us
	 *            o usuario a remover.
	 */
	public void remove(Usuario us) {
		usuarios.remove(us);
	}

	/**
	 * Responde se a colecao ja contem o usuario passado como parametro
	 * 
	 * @param usuario
	 *            o usuario a pesquisar
	 * @return true, se o usuario estiver na colecao, false, caso contrario
	 */
	public boolean contains(Usuario usuario) {
		return usuarios.contains(usuario);
	}

	/**
	 * Retorna um iterador de usuarios
	 * 
	 * @return o iterador
	 */
	public Iterator<Usuario> iterator() {
		return usuarios.iterator();
	}

	/**
	 * Retorna a representacao String da colecao
	 * 
	 * @return a representacao String da colecao
	 */
	public String toString() {
		return usuarios.toString();
	}
}